/**
 * 自动构建 packages 下所有子项目， 支持单独指定构建某个子项目
 * 全部构建子项目执行命令： zx build.mjs
 * 构建特定子项目 xxx 执行命令： zx build.mjs xxx
 * 注意！！！： 子项目需要有 设置 build 命令才行
 *
 * 支持自动构建子项目脚本
 * 子项目目录创建 scripts
 * scripts 中创建  build_   开头的 js 文件
 * 构建时会自动执行子项目中的构建脚本
 */
import { fs, path, $, within, chalk, cd } from 'zx';
import { stdout, existPackageJson } from './utils.mjs';

const packagesPath = path.join(__dirname, '../packages');

const projectNames = process.argv.slice(3)

// 执行构建 & 执行子项目脚本
console.log(chalk.redBright(`即将为您构建包`))

for (const fileName of fs.readdirSync(packagesPath)) {
  // 如果指定发布某个包
  if (projectNames.length && !projectNames.includes(fileName)) continue;
  console.log(chalk.redBright(`正在构建 packages/${fileName}`))

  // 构建项目 - 确定 package 中有 build 命令
  const projectPath = path.resolve(packagesPath, fileName);
  await existPackageJson(projectPath, async (packageJsonPath) => {
    const packageJson = fs.readJsonSync(packageJsonPath);

    if (packageJson?.scripts?.build) {
      await cd(projectPath);
      await stdout($`pnpm build`)
    }
  })

  // 执行子脚本
  const scriptsPath = path.resolve(packagesPath, `${fileName}/scripts`);
  if (fs.existsSync(scriptsPath)) {
    for (const script of fs.readdirSync(scriptsPath)) {
      if (script.startsWith('build_')) {
        console.log(chalk.yellow(`<${fileName}> 执行子项目脚本 [${script}]`))

        await within(async () => {
          await stdout($`zx ${scriptsPath}/${script}`);
        })
      }
    }
  }
}




